package cn.demoncat.util.jpa;

import cn.demoncat.util.lang.entity.PageParam;
import cn.demoncat.util.lang.entity.Pager;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * JAP操作工具
 *
 * @author 延晓磊
 * @since 2021年04月02日
 */
public class JapUtil {

    /**
     * 分页查询
     *
     * @param repository    操作仓库
     * @param pageNum       页码
     * @param pageSize      页长
     * @param example       查询条件
     * @param sort          排序方式
     * @param <T>   实体类
     * @param <ID>  主键
     * @return
     *
     * @author 延晓磊
     * @since 2021年04月02日
     */
    public static <T,ID> Pager<T> findPage(JpaRepository<T, ID> repository, Integer pageNum, Integer pageSize, Example<T> example, Sort sort){
        // 分页构建参数：页首为1
        PageParam pageParam = PageParam.build(pageNum, pageSize);
        // 分页请求参数：页首为0
        PageRequest pageRequest = PageRequest.of(pageParam.getPageNum() - 1, pageParam.getPageSize(), sort == null ? Sort.unsorted() : sort);
        // 查询数据库
        Page<T> page = example == null ? repository.findAll(pageRequest) : repository.findAll(example, pageRequest);
        // 转换结果
        Pager<T> pager = new Pager<>();
        pager.setPageNum(pageParam.getPageNum());
        pager.setPageSize(pageParam.getPageSize());
        pager.setPageStart(pageParam.getPageStart());
        pager.setTotalCount(page.getTotalElements());
        pager.setPageCount(page.getTotalPages());
        pager.setList(page.getContent());
        return pager;
    }

    /**
     * 分页查询
     *
     * @param repository    操作仓库
     * @param pageNum       页码
     * @param pageSize      页长
     * @param sort          排序方式
     * @return
     *
     * @author 延晓磊
     * @since 2021年04月02日
     */
    public static <T,ID>Pager<T> findPage(JpaRepository<T, ID> repository, Integer pageNum, Integer pageSize, Sort sort){
        return findPage(repository, pageNum, pageSize, null, sort);
    }

    /**
     * 分页查询
     *
     * @param repository    操作仓库
     * @param pageNum       页码
     * @param pageSize      页长
     * @param example       查询条件
     * @return
     *
     * @author 延晓磊
     * @since 2021年04月02日
     */
    public static <T,ID>Pager<T> findPage(JpaRepository<T, ID> repository, Integer pageNum, Integer pageSize, Example<T> example){
        return findPage(repository, pageNum, pageSize, example, null);
    }

    /**
     * 分页查询
     *
     * @param repository    操作仓库
     * @param pageNum       页码
     * @param pageSize      页长
     * @return
     *
     * @author 延晓磊
     * @since 2021年04月02日
     */
    public static <T,ID>Pager<T> findPage(JpaRepository<T, ID> repository, Integer pageNum, Integer pageSize){
        return findPage(repository, pageNum, pageSize, null, null);
    }
}
